home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / CBGRX100.ARJ / SETMODE.C < prev    next >
Text File  |  1992-04-10  |  6KB  |  215 lines

  1. /** 
  2.  ** SETMODE.C 
  3.  **
  4.  **  Copyright (C) 1992, Csaba Biegl
  5.  **    820 Stirrup Dr, Nashville, TN, 37221
  6.  **    csaba@vuse.vanderbilt.edu
  7.  **
  8.  **  This file is distributed under the terms listed in the document
  9.  **  "copying.cb", available from the author at the address above.
  10.  **  A copy of "copying.cb" should accompany this file; if not, a copy
  11.  **  should be available from where this file was obtained.  This file
  12.  **  may not be distributed without a verbatim copy of "copying.cb".
  13.  **  You should also have received a copy of the GNU General Public
  14.  **  License along with this program (it is in the file "copying");
  15.  **  if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  16.  **  Cambridge, MA 02139, USA.
  17.  **
  18.  **  This program is distributed in the hope that it will be useful,
  19.  **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  **  GNU General Public License for more details.
  22.  **/
  23.  
  24. #define  _SETMODE_C_
  25.  
  26. #include "grx.h"
  27. #include "libgrx.h"
  28. #include "grdriver.h"
  29.  
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include <string.h>
  33.  
  34.  
  35. GrContext _GrContext;            /* current graphics context */
  36. GrContext _GrVidPage;            /* the whole screen */
  37.  
  38. int  _GrCurrentMode    = GR_default_text;    /* current video mode */
  39. int  _GrCanBcopyInBlit = FALSE;        /* separate R/W pages in adapter */
  40. int  _GrBigFrameBuffer = FALSE;        /* set if frame buffer > 64K */
  41. int  _GrNumColors      = 256;        /* number of colors */
  42. int  _GrAdapterType    = GR_VGA;    /* type of video adapter */
  43. int  _GrDriverIndex    = 0;        /* low-level video routine selector */
  44. int  _GrRdOnlyOffset   = 0;        /* add for read-only video page */
  45. int  _GrWrOnlyOffset   = 0;        /* add for write-only video page */
  46.  
  47. int  _GrScreenX = 80;            /* screen width  */
  48. int  _GrScreenY = 25;            /* screen height */
  49.  
  50. char _GrMouseDrawn = 0;            /* set if mouse drawn */
  51. char _GrMouseCheck = 0;            /* set if mouse blocking needed */
  52.  
  53. static void dummy(void) {}
  54.  
  55. int  (*_GrMouseBlock)(GrContext *c,int x1,int y1,int x2,int y2);
  56. void (*_GrMouseUnBlock)(void);
  57. void (*_GrMouseUnInit)(void) = dummy;
  58.  
  59. static void (*setmodehook)(void) = NULL;
  60.  
  61. #ifndef _SINGLE_MODE_
  62. handler  _GrResetValues[NumOfHandlers]      = { NULL };
  63. handler *_GrResetAddresses[NumOfHandlers] = { NULL };
  64. #endif
  65.  
  66. void GrSetMode(int mode,int width,int height,int colors)
  67. {
  68.     long planesize;
  69.     int  flags;
  70.  
  71.     (*_GrMouseUnInit)();
  72. #ifndef _SINGLE_MODE_
  73.     for(flags = 0; flags < NumOfHandlers; flags++) {
  74.         if(_GrResetValues[flags] == NULL) continue;
  75.         *(_GrResetAddresses[flags]) = _GrResetValues[flags];
  76.     }
  77. #endif
  78.     if((mode >= GR_80_25_text) && (mode <= GR_width_height_color_graphics)) {
  79.         memset(&_GrVidPage,0,sizeof(GrContext));
  80.         flags = _GrLowSetMode(mode,width,height,colors);
  81.         _GrCurrentMode = mode;
  82.         switch(flags & GRD_TYPE_MASK) {
  83.           case GRD_VGA:
  84.         _GrVidPage.gc_baseaddr = (char far *)VGA_FRAME;
  85.         _GrAdapterType = GR_VGA;
  86.         break;
  87.           case GRD_EGA:
  88.         _GrVidPage.gc_baseaddr = (char far *)EGA_FRAME;
  89.         _GrAdapterType  = GR_EGA;
  90.         break;
  91.           case GRD_HERC:
  92.         _GrVidPage.gc_baseaddr = (char far *)HERC_FRAME;
  93.         _GrAdapterType  = GR_HERC;
  94.         break;
  95.           default:
  96.         _GrLowSetMode(GR_default_text,0,0,0);
  97.         fputs("GrSetMode: unknown adapter type in driver\n",stderr);
  98.         exit(1);
  99.         }
  100.         switch(flags & GRD_PLANE_MASK) {
  101. #if (GRXPLANES & 8)
  102.           case GRD_8_PLANES:
  103.         if(_GrAdapterType != GR_VGA) goto Default;
  104.         _GrDriverIndex = VGA256_DRIVER;
  105.         _GrNumColors = 256;
  106.         break;
  107. #endif
  108. #if (GRXPLANES & 4)
  109.           case GRD_4_PLANES:
  110.         if(_GrAdapterType == GR_HERC) goto Default;
  111.         _GrDriverIndex = VGA16_DRIVER;
  112.         _GrNumColors = 16;
  113.         break;
  114. #endif
  115. #if (GRXPLANES & 1)
  116.           case GRD_1_PLANE:
  117.         if(_GrAdapterType != GR_HERC) goto Default;
  118.         _GrDriverIndex = HERC_DRIVER;
  119.         _GrNumColors = 2;
  120.         break;
  121. #endif
  122.           default:
  123.           Default:
  124.         _GrLowSetMode(GR_default_text,0,0,0);
  125.         fputs("GrSetMode: bad color plane # in driver\n",stderr);
  126.         exit(1);
  127.         }
  128.         if(mode >= GR_320_200_graphics) {
  129.         planesize = GrPlaneSize(_GrScreenX,_GrScreenY);
  130. #ifdef _MAXVIDPLANESIZE
  131.         if(planesize > _MAXVIDPLANESIZE) {
  132.             _GrLowSetMode(GR_default_text,0,0,0);
  133.             fputs("GrSetMode: graphics mode too big\n",stderr);
  134.             exit(1);
  135.         }
  136. #endif
  137.         if(planesize < 0x10000L) {
  138.             _GrCanBcopyInBlit = TRUE;
  139.             _GrBigFrameBuffer = FALSE;
  140.             _GrRdOnlyOffset   = 0;
  141.             _GrWrOnlyOffset   = 0;
  142.         }
  143.         else if((flags & GRD_PAGING_MASK) == GRD_RW_64K) {
  144.             _GrCanBcopyInBlit = TRUE;
  145.             _GrBigFrameBuffer = TRUE;
  146.             _GrRdOnlyOffset   = RDONLY_OFF;
  147.             _GrWrOnlyOffset   = WRONLY_OFF;
  148.         }
  149.         else {
  150.             _GrCanBcopyInBlit = FALSE;
  151.             _GrBigFrameBuffer = TRUE;
  152.             _GrRdOnlyOffset   = 0;
  153.             _GrWrOnlyOffset   = 0;
  154.         }
  155.         _GrVidPage.gc_onscreen     = TRUE;
  156.         _GrVidPage.gc_frameaddr  = BASE_ADDRESS(&_GrVidPage);
  157.         _GrVidPage.gc_lineoffset = GrLineOffset(_GrScreenX);
  158.         _GrVidPage.gc_xmax = _GrVidPage.gc_xcliphi = _GrScreenX - 1;
  159.         _GrVidPage.gc_ymax = _GrVidPage.gc_ycliphi = _GrScreenY - 1;
  160.         _GrContext = _GrVidPage;
  161.         if(_GrNumColors == 16) _GrP4Init(flags & GRD_MEM_MASK);
  162.         GrRefreshColors();
  163.         _GrMouseDrawn = 0;
  164.         _GrMouseCheck = 0;
  165.         }
  166.         if(setmodehook != NULL) (*setmodehook)();
  167.     }
  168. }
  169.  
  170. void GrSetModeHook(void (*hookfunc)(void))
  171. {
  172.     setmodehook = hookfunc;
  173. }
  174.  
  175. int GrCurrentMode(void)
  176. {
  177.     return(_GrCurrentMode);
  178. }
  179.  
  180. int GrAdapterType(void)
  181. {
  182.     return(_GrAdapterType);
  183. }
  184.  
  185. int GrScreenX(void)
  186. {
  187.     return(_GrScreenX);
  188. }
  189.  
  190. int GrScreenY(void)
  191. {
  192.     return(_GrScreenY);
  193. }
  194.  
  195. int GrSizeX(void)
  196. {
  197.     return(_GrContext.gc_xmax + 1);
  198. }
  199.  
  200. int GrSizeY(void)
  201. {
  202.     return(_GrContext.gc_ymax + 1);
  203. }
  204.  
  205. int GrMaxX(void)
  206. {
  207.     return(_GrContext.gc_xmax);
  208. }
  209.  
  210. int GrMaxY(void)
  211. {
  212.     return(_GrContext.gc_ymax);
  213. }
  214.  
  215.